package com.jiexinyun.validator;

import com.jiexinyun.utils.CommonUtils;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;

@Slf4j
public class PathValidator {

    // 允许的路径名正则表达式
    private static final String PATH_REGEX = "^(/?[a-zA-Z0-9._-]+)+/?$";
    private static final Pattern PATH_PATTERN = Pattern.compile(PATH_REGEX);

    // 不允许的字符
    private static final String INVALID_CHARS = "\\/:*?\"<>|";

    /**
     * 验证路径名是否合法
     * @param path 要验证的路径
     * @return true如果路径合法，false如果不合法
     */
    public static boolean isValidPath(String path) {
        if (CommonUtils.isBlank(path)) {
            return false;
        }

        // 检查长度限制（通常Linux路径最大4096字节） 虽然这样 我还是现在严格一点 用200
        if (path.length() > 50) {
            return false;
        }

        // 检查不允许的字符
        for (char c : INVALID_CHARS.toCharArray()) {
            if (path.indexOf(c) != -1) {
                return false;
            }
        }

        // 检查特殊路径（如.或..）
        if (path.equals(".") || path.equals("..")) {
            return false;
        }

        // 使用正则表达式验证整体格式
        return PATH_PATTERN.matcher(path).matches();
    }

    /**
     * 验证路径名是否合法
     * 例如 /aaa/bbb/ccc 需要拆解成 ['aaa','bbb','ccc']  然后依次递归建立目录
     * @param pathStr 要验证的路径
     * @return true如果路径合法，false如果不合法
     */
    public static List<String> isValidMultiplePath(String pathStr) {

        List<String> paths = new ArrayList<>();
        if (CommonUtils.isBlank(pathStr)) {
            log.info("路径为空");
            return paths;
        }

        // 检查长度限制（通常Linux路径最大4096字节） 虽然这样 我还是现在严格一点 用200
        if (pathStr.length() > 500) {
            log.info("路径长度超过限制");
            return paths;
        }

        // 检查特殊路径（如.或..）
        if (pathStr.equals(".") || pathStr.equals("..")) {
            log.info("路径为特殊路径");
            return paths;
        }

        //兼容处理
        if(pathStr.startsWith("/")) {
            pathStr = pathStr.substring(1);
        }

        if(pathStr.endsWith("/")) {
            pathStr = pathStr.substring(0, pathStr.length()-1);
        }

        //使用/拆解成多个路径
        paths = Arrays.asList(pathStr.split("/"));
        if(CommonUtils.isEmpty(paths)) {
            log.info("创建多级路径时，路径之间需要/分隔");
            return paths;
        }
        //其中任何一个校验不通过，都不创建路径
        for (String path : paths) {
            boolean f = isValidPath(path);
            if(!f) {
                return new ArrayList<>();
            }
        }
        return paths;
    }

}
